package com.c2b.algorithm.leetcode.jzoffer;

import java.util.HashMap;
import java.util.Map;

/**
 * <a href="https://leetcode.cn/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/">第一个只出现一次的字符</a>
 * <p>在字符串 s 中找出第一个只出现一次的字符。如果没有，返回一个单空格。 s 只包含小写字母。</p>
 * <pre>
 *   示例 1:
 *      输入：s = "abaccdeff"
 *      输出：'b'
 *    示例 2:
 *      输入：s = ""
 *      输出：' '
 * </pre>
 * 限制：0 <= s 的长度 <= 50000
 * @author c2b
 * @since 2023/4/4 10:35
 */
public class JzOffer0050FirstUniqChar_S {

    public char firstUniqChar(String s) {
        if (s == null || s.equals("")) {
            return ' ';
        }
        //只出现一次说明第一次就是最后一次 由此判断
        // 题目给定范数据围[0,50000]+1即可。即是50001
        int res = 50001;
        //int first, last;
        for (int i = 0; i < 26; i++) {
            // 第一次出现的情况
            int firstIndex = s.indexOf(i + 'a');
            if (firstIndex != -1) {
                // 最后一次出现的位置
                int lastIndex = s.lastIndexOf(i + 'a');
                if (firstIndex == lastIndex) {
                    // 更新索引
                    res = Math.min(res, firstIndex);
                }
            }
        }
        return res == 50001 ? ' ' : s.charAt(res);
    }

    public char firstUniqChar2(String s) {
        if (s == null || s.equals("")) {
            return ' ';
        }
        int[] charArr = new int[26];
        for (int i = 0; i < s.length(); i++) {
            charArr[s.charAt(i) - 'a']++;
        }
        for (int i = 0; i < s.length(); i++) {
            if (charArr[s.charAt(i)-'a']==1) {
                return s.charAt(i);
            }
        }
        return ' ';
    }


    public char firstUniqChar3(String s) {
        if (s == null || s.equals("")) {
            return ' ';
        }
        Map<Character, Integer> characterIntegerMap = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            Integer count = characterIntegerMap.getOrDefault(s.charAt(i), 0);
            characterIntegerMap.put(s.charAt(i), count + 1);
        }
        for (int i = 0; i < s.length(); i++) {
            if (characterIntegerMap.get(s.charAt(i)) == 1) {
                return s.charAt(i);
            }
        }
        return ' ';
    }

    public static void main(String[] args) {
        JzOffer0050FirstUniqChar_S jzOffer0050FirstUniqChar_s = new JzOffer0050FirstUniqChar_S();
        System.out.println(jzOffer0050FirstUniqChar_s.firstUniqChar("cc"));
    }
}
